home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
ms_dos
/
thbaba
/
thbaba.c
next >
Wrap
C/C++ Source or Header
|
1993-11-30
|
10KB
|
508 lines
/*
“THbaba”ババ抜き
By 五味(93/09/15~93/09/16)
(93/09/25)
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define FAIL -1
#define PLAYERMAX 8
/* 最大プレイヤー数 */
char *name[]={ "あなた","TAWAT'93","こば","Mr.THREE",
"TON","かだお","さとおし","むろた" };
char *suit[]={ "○","●","□","■" };
char *hsuit[]={ "#","$","@","+"};
/* char *hsuit[]={ "","","",""}; */
char *numb[]={ "A","2","3","4","5","6","7","8","9","10",
"J","Q","K","JOKER" };
char *hnumb[]={"A","2","3","4","5","6","7","8","9","10","J","Q","K",
"joker" };
char *title= "\n"
" “THbaba”ババ抜き V1.0a\n"
" (c) H.Gomi 93/09/25\n\n";
char *usage= " [usage] THbaba [-h][-r][-pN][-n[N] NAME][-gN]\n"
" [-c][-o]\n"
"\n"
" [options] -h ソフトの説明\n"
" -r ルールの説明\n"
" -pN プレイヤー数\n"
" -nN プレイヤー名の変更\n"
" -gN 最大ゲーム数\n"
"\n"
" -c ANK文字で表示\n"
" -o 数字だけで表示\n";
char *rule= " [ルール説明]\n\n"
" 詳しいルールは書きませんが、とにかく\n"
" 同じ番号の二つのカードは捨てることが出\n"
" 来て、早くカードを無くした方が勝ちです。\n"
" 引かれて無くなった方と、引いてカードを\n"
" 捨てて無くなった方では、後者が先に上がっ\n"
" たことになります。\n";
int nplayer=4; /* プレイヤー数 */
int card[PLAYERMAX][54]; /* プレイヤーの保持カード */
int isdeal[54]; /* そのカードは配られたか? */
int win[PLAYERMAX]; /* プレイヤーの勝ち数 */
int gameno=1; /* ゲーム数 */
int gamemax=0; /* 総ゲーム数 */
int ttbl[PLAYERMAX]; /* 一番~N番のプレイヤー番号 */
int repnt; /* 残っているポイント */
void put_score(void) /* スコア表示 */
{
int i;
printf( " 名前 | 点数\n"
" ---------+------\n" );
for( i=0 ; i<nplayer ; i++ )
printf(" %8s | %3d\n",name[i],win[i]);
printf("\n");
}
void THbaba_end() /* 終了ルーチン */
{
int i,k;
printf("\n");
if( gamemax==gameno )
printf( " 全%dゲーム終了 成績表\n\n",gamemax);
put_score();
for( i=0,k=0 ; i<nplayer ; i++ )
if( win[i]>k ) k=win[i];
printf(" 勝者は ");
for( i=0 ; i<nplayer ; i++ )
if( win[i]==k ) printf("%s ",name[i]);
printf("です.\n\n");
getch();
printf(" 今後ともよろしく(^_^;) by H.Gomi\n");
exit(0);
}
int keywait(void) /* 終了付キー待ち */
{
int c;
re_kw:
c=getch();
if( c=='q' || c=='Q' ) {
printf(" ゲームをやめるのですか?(y/n)\n");
c=getch();
if( c=='y' || c=='Y' )
THbaba_end();
else{
printf(" では再開します.\n\n");
goto re_kw;
}
} /* 終了処理 */
return c;
}
void deal_card(void) /* カード配付 */
{
int i,ii,c,cc;
for( i=0 ; i<nplayer ; i++ )
for( ii=0 ; ii<54 ; ii++ )
card[i][ii]=-1;
for( ii=0 ; ii<54 ; ii++ )
isdeal[ii]=FALSE;
for( ii=0 ; ; ii++ ) {
for( i=0 ; i<nplayer ; i++ ) {
for( c=rand()%53,cc=c+1 ; isdeal[cc%53]==TRUE ; cc++ )
if( cc%53==c ) goto dealoop_end;
card[ttbl[i]][ii]=cc%53;
isdeal[cc%53]=TRUE;
}
}
dealoop_end:
return;
}
int put_card(int c) /* カード表示 */
{
if( c==-1 )
return 1;
if( c!=53-1 )
printf(" %s%s",suit[c/13],numb[c%13]);
else
printf(" JOKER");
}
int put_cardlist(int i) /* カード全部表示 */
{
int ii,c;
for( ii=0,c=0 ; ii<54 ; ii++ )
c+=1-put_card(card[i][ii]);
if( c==0 ) printf(" なし\n");
else printf("\n");
return c;
}
void getout_card(int i) /* カードを出して、そのカードを表示 */
{
int ii,k,c,f;
for( ii=0,f=TRUE ; ii<13 ; ii++ ) {
for( k=0,c=-1 ; k<54 ; k++ ) {
if( card[i][k]%13==ii && card[i][k]!=52 ) {
if( c==-1 ) c=k;
else{ put_card(card[i][c]);
put_card(card[i][k]);
card[i][c]=card[i][k]=-1;
c=-1;
f=FALSE;
}
}
}
}
if( f==FALSE )
printf("\n");
else
printf(" なし\n");
}
int count_card(int i) /* カードの数を返す */
{
int ii,k;
for( ii=0,k=0 ; ii<54 ; ii++ )
if( card[i][ii]!=-1 ) k++;
return k;
}
int get_card(int i,int l,int j) /* カードを抜き取る */
{
int ii,k,c;
for( ii=0,k=0 ; ii<54 ; ii++ ) {
if( card[i][ii]!=-1 ) {
if( k==l ) {
c=card[i][ii];
card[i][ii]=-1;
for( ii=0,k=0 ; ii<54 ; ii++ ) {
if( card[j][ii]==-1 ) {
card[j][ii]=c;
return c;
}
}
}
k++;
}
}
}
/*
ゲーム本体
*/
void baba(void)
{
int i,k,c,cc,f,n;
put_score();
keywait(); /* スコア表示 */
for( i=0 ; i<nplayer ; i++ ) ttbl[i]=-1;
for( i=0 ; i<nplayer ; i++ ){
for( c=rand()%nplayer,k=c+1 ; ttbl[k%nplayer]!=-1 ; k++ );
ttbl[k%nplayer]=i;
} /* やる順を決める */
printf(" 第%d回戦\n",gameno);
printf(" 順番:→");
for( i=0 ; i<nplayer ; i++ )
printf("%s→",name[ttbl[i]]);
printf("\n\n"); /* やる順を表示 */
deal_card();
keywait(); /* カードを配る */
printf(" [最初のカード]\n");
put_cardlist(0);
printf("\n");
keywait(); /* 最初の手札表示 */
printf(" [出せたカード]\n");
for( i=0 ; i<nplayer ; i++ ) {
printf(" %8s :",name[ttbl[i]]);
getout_card(ttbl[i]);
}
printf("\n");
keywait(); /* 出したカードの表示 */
printf(" [残りのカード]\n");
for( i=0 ; i<nplayer ; i++ ) {
if( ttbl[i]==0 ){
printf(" %8s :",name[0]);
put_cardlist(0);
}else{
printf( " %8s : あと%d枚.\n",
name[ttbl[i]],count_card(ttbl[i]));
}
}
printf("\n");
keywait(); /* 残りカードの表示 */
repnt=nplayer-1; /* 上がった時の得点の初期化 */
for( i=0,f=0 ; i<nplayer ; i++ )
if( count_card(ttbl[i])==0 ){
printf( " %s のカードが最初から全部無くなりました!\n",
name[ttbl[i]]);
win[ttbl[i]]+=repnt;
f++;
}
repnt-=f; /* いきなり上がった時の処理 */
printf(" ではゲーム開始です.\n\n");
keywait();
for( ; repnt>0 ; ) /* 大ループ */
for( i=0 ; i<nplayer && repnt>0 ; i++ ) {
if( count_card(ttbl[i])>0 )
if( ttbl[i]==0 ){
for( f=1 ; f<nplayer ; f++ ) {
k=ttbl[(i+f)%nplayer];
c=count_card(k);
if( c>0 ) break;
}
printf( " %s の番です.←%s\n",name[0],name[k] );
printf( " 現在のカード:");
put_cardlist(0);
printf("\n");
keywait();
if( c!=1 ) {
printf( " %s には %d枚のカードがあります.\n"
,name[k],c);
do{
printf( " 何枚目を引きますか?(1-%d)\n",c);
if( c>=10 ) {
n=keywait()-'0';
if( isdigit(cc=keywait()) )
n=n*10+(cc-'0');
n--;
}else n=keywait()-'0' -1;
}while( n<0 || c<=n );
}else{
printf( " %s には 一枚しかカードがありません.\n"
,name[k]);
keywait();
n=0;
}
printf("\n");
put_card(get_card(k,n,0));
printf("\n\n");
printf( " 出せたカード:");
getout_card(ttbl[i]);
printf( " 現在のカード:");
n=put_cardlist(0);
printf("\n");
keywait();
if( n==0 ) {
printf( " %s のカードが全部無くなりました.\n"
,name[0]);
win[0]+=repnt--;
if( c==1 ){
printf( " %s が先に上がりました.\n\n"
,name[0]);
printf( " %s も上がりました.\n\n"
,name[k]);
win[k]+=repnt--;
}else
printf( " %s は上がりました.\n\n"
,name[0]);
keywait();
}else if( c==1 ){
printf( " %s のカードが全部無くなりました.\n"
" %s は上がりました.\n\n"
,name[k],name[k]);
win[k]+=repnt--;
keywait();
}
}else{
for( f=1 ; f<nplayer ; f++ ) {
k=ttbl[(i+f)%nplayer];
c=count_card(k);
if( c>0 ) break;
}
printf( " %8s : あと%d枚.←%s\n",
name[ttbl[i]],count_card(ttbl[i]),name[k] );
keywait();
if( c!=1 ) {
n=rand()%c;
}else{
printf( " %s には一枚しかカードがありません.\n"
,name[k]);
keywait();
n=0;
}
n=get_card(k,n,ttbl[i]);
if( k==0 ) {
printf( " %s は",name[ttbl[i]]);
put_card(n);
printf( " を取りました.\n");
}
printf( " 捨カード :");
getout_card(ttbl[i]);
printf("\n");
keywait();
if( count_card(ttbl[i])==0 ) {
printf( " %s のカードが全部無くなりました.\n"
,name[ttbl[i]]);
win[ttbl[i]]+=repnt--;
if( c==1 ){
printf( " %s が先に上がりました.\n\n"
,name[ttbl[i]]);
printf( " %s も上がりました.\n\n"
,name[k]);
win[k]+=repnt--;
}else
printf( " %s は上がりました.\n\n"
,name[ttbl[i]]);
keywait();
}else if( c==1 ){
printf( " %s のカードが全部無くなりました.\n"
" %s は上がりました.\n\n"
,name[k],name[k]);
win[k]+=repnt--;
keywait();
}
}
}
}
/*
メイン
*/
void main(int argc,char *argv[])
{
int i,k;
printf(title);
for( i=1 ; i<argc ; i++ )
if( *argv[i]=='-' || *argv[i]=='/' ) {
strlwr(argv[i]);
switch( *(argv[i]+1) ) {
case'h':
printf(usage);
exit(0);
case'r':
printf(rule);
exit(0);
case'p':
nplayer=atoi(argv[i]+2);
if( nplayer<3 || 8<nplayer ) {
printf(" プレイヤー数の指定に誤りがあります(3~8)\n");
exit(1);
}
if( nplayer<4 )
for( k=0 ; k<13 ; k++ )
strcpy(numb[k],hnumb[k]);
break;
case'n':
k=atoi(argv[i]+2);
if( k<0 || 7<k ) {
printf(" 名前番号の指定が違法です(0…自分、1~7…相手)\n");
exit(1);
}
if( i==argc-1 ) name[k]="\0";
else name[k]=(argv[++i]);
break;
case'g':
gamemax=atoi(argv[i]+2);
if( gamemax<0 ) {
printf(" 最大ゲーム数が違法です.\n");
exit(1);
}
break;
case'c':
for( k=0 ; k<13 ; k++ )
strcpy(numb[k],hnumb[k]);
for( k=0 ; k<4 ; k++ )
strcpy(suit[k],hsuit[k]);
break;
case'o':
for( k=0 ; k<4 ; k++ )
*suit[k]='\0';
break;
}
}
srand((unsigned int)clock());
for( i=0 ; i<nplayer ; i++ )
win[i]=0; /* データ初期化 */
for( ; ; gameno++ ) {
baba(); /* ゲームループ */
if( gamemax )
if( gamemax==gameno )
THbaba_end(); /* 総ゲーム数が決まっている場合 */
}
}